package LocalCRM::Doc::Invoice;

use base 'LocalCRM::Doc';
use PDF::Table;
use Data::Dumper;
use Encode;
use strict;

sub new
{
    my $self = shift->SUPER::new();
    my %arg  = @_;
    my @r;
    my ($x,$y);

# Шапка таблицы
    $self->{data}->{content}=
    [
	[
	    encode('windows-1251',decode_utf8("Наименование товара (описание выполненных работ,\nоказанных услуг), имущественного права")),
	    '',
	    '',
	    encode('windows-1251',decode_utf8("Коли-\nчество\n(объем)")),
	    encode('windows-1251',decode_utf8("Цена (тариф)\nза единицу\nизмерения")),
	    encode('windows-1251',decode_utf8("Стоимость товаров\n(работ, услуг),\nимущественных прав,\nвсего без налога")),
	    encode('windows-1251',decode_utf8("В том\nчисле\nакциз")),
	    encode('windows-1251',decode_utf8("Налоговая\nставка")),
	    encode('windows-1251',decode_utf8("Сумма\nналога")),
	    encode('windows-1251',decode_utf8("Стоимость товаров\n(работ, услуг),\nимущественных прав,\nвсего c учетом\nналога")),
	    '',
	    '',
	    encode('windows-1251',decode_utf8("Номер\nтаможенной\nдекларации")),
	],
	[1,2,'2a',3,4,5,6,7,8,9,10,'10a',11]
    ];

    $self->{_table}	= new PDF::Table;
    $self->{page}	= $self->{pdf}->page();
    $self->{page}->mediabox(842.4,597.6);

    my $text	= $self->{page}->text();
    $text->font($self->{font}->{Verdana},7);

    if ( $arg{id} )
    {
	$self->id($arg{id})
    }
    elsif ( $arg{'executive_id'} )
    {
	$self->{invoice} = $self->{_db}->getById('executive',$arg{'executive_id'});
    }
    else
    {
	$text->font($self->{font}->{VerdanaB},16);
	$text->translate(100,400);
	$text->text($self->utf2win('Недостаточно параметров для формирования документа'));
	$text->font($self->{font}->{Verdana},12);
	$text->cr(-30);
	$text->text($self->utf2win('В ходе формирования документа произошла ошибка!'));
	$text->cr(-15);
	$text->text($self->utf2win('В метод формирования не были переданы обязательные параметры'));
	$text->cr(-15);
	$text->text($self->utf2win('Номер документа для формирования или ID исполнителя услуги для формирования шаблона.'));
	return $self;
    }

    if ( !$self->{invoice}->{nds} ) { return undef; }

    my $gfx = $self->{page}->gfx();

# Примечание в верхнем правом углу
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8($self->{invoice}->{invoice_text1})),
	x	=> 220,
	y	=> 580,
	w	=> 600,
	h	=> 5/2.54*72,
	align	=> 'right',
    );

# Разные поля над таблицей

# БЛОК ПРОДАВЦА
    $text->translate(200,460);
    $text->font($self->{font}->{VerdanaB},8);
    $text->text(encode('windows-1251',decode_utf8(sprintf 'СЧЕТ-ФАКТУРА № %d от "%d" %s %d г.', $self->{invoice}->{id}, $self->{invoice}->{date}->mday(), $self->{month}->{rod}->{$self->{invoice}->{date}->month()},$self->{invoice}->{date}->year())));
    $text->cr(-15);
    $text->text(encode('windows-1251',decode_utf8(sprintf 'ИСПРАВЛЕНИЕ № - от -', $self->{invoice}->{id}, $self->{invoice}->{date}->strftime('%d.%m.%Y'))));

    $text->font($self->{font}->{Verdana},8);
    $text->translate(20,430);
    $text->cr(-15);
    $text->text(encode('windows-1251',decode_utf8('Продавец:')));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8('Адрес:')));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8('ИНН/КПП продавца:')));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8('Грузоотправитель и его адрес:')));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8('Грузополучатель и его адрес:')));

    if ( $self->{invoice}->{invoice_text7} )
    {
	$text->cr(-10);
	$text->text(encode('windows-1251',decode_utf8('К платежно-расчетному документу №:',)));
    }

    $text->translate(200,415);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_text2})));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_text3})));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_text4})));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_text5})));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_text6})));

    if ( $self->{invoice}->{invoice_text7} )
    {
	$text->cr(-10);
	$text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_text7})));
    }
# / БЛОК ПРОДАВЦА

# БЛОК ПОКУПАТЕЛЯ
    $text->cr(-15);
    $text->distance(-180);
    ($x, $y) = $text->textpos();

    $text->text(encode('windows-1251',decode_utf8('Покупатель:')));
    $self->{_table}->text_block
    (
	$text,
	encode('windows-1251',decode_utf8($self->{invoice}->{customer_name})),
	x	=> 200,
	y	=> $y,
	h	=> 20,
	w	=> 600,
	lead	=> -5
    );

    ($x, $y) = $text->textpos();
    $text->translate(20,$y-10);
    $text->text(encode('windows-1251',decode_utf8('Адрес:')));

    $text->translate(200,$y-10);
    $text->text
    (
	encode
	(
	    'windows-1251',
	    decode_utf8
	    (
		(
		    sprintf '%s, %s, %s, %s, %s%s',
			$self->{invoice}->{legal_index},
			$self->{invoice}->{legal_region},
			$self->{invoice}->{legal_city},
			$self->{invoice}->{legal_street},
			$self->{invoice}->{legal_home},
			$self->{invoice}->{legal_litera})
			.($self->{invoice}->{legal_office}?(" - ".$self->{invoice}->{legal_office}):undef)
	    )
        )
    );

    ($x, $y) = $text->textpos();
    $text->translate(20,$y-10);
    $text->text(encode('windows-1251',decode_utf8('ИНН/КПП получателя:')));

    $text->translate(200,$y-10);
    $text->text(sprintf '%s / %s',$self->{invoice}->{inn},$self->{invoice}->{kpp});
# / БЛОК ПОКУПАТЕЛЯ

    $text->font($self->{font}->{VerdanaB},8);
    $text->translate(20,$y-40);
    $text->text($self->utf2win('Валюта: наименование, код'));
    $text->translate(200,$y-40);
    $text->text($self->utf2win('Российский рубль, 643'));

    $text->cr(-10);
    ($x, $y) = $text->textpos();

# Формирование и заполнение таблицы
    @r = $self->{_table}->table
    (
	$self->{pdf},
	$self->{page},
	$self->{data}->{content},
	x	=> 7,
	w	=> 28/2.54*72,
	start_y	=> $y,
	start_h	=> 200,
	font	=> $self->{font}->{Verdana},
	font_size	=> 7,
	padding	=> 2,
	column_props	=>
	[
	    {min_w=>250,justify=>'center'},
	    {justify=>'center'},
	    {min_w=>65,justify=>'center'},
	    {justify=>'center'},
	    {min_w=>50,justify=>'center'},
	    {justify=>'center'},
	    {justify=>'center'},
	    {justify=>'center'},
	    {min_w=>60,justify=>'center'},
	    {justify=>'center'},
	    {min_w=>40,justify=>'center'},
	    {min_w=>60,justify=>'center'},
	    {justify=>'center'},
	]
    );

    my $gfx2 = $self->{page}->gfx();
    $gfx2->fillcolor('#ffffff');
    $gfx2->rectxy($r[3][1],$y,$r[3][3],$y-17);
    $gfx2->rectxy($r[3][10],$y,$r[3][12],$y-17);
    $gfx2->fillstroke();
    undef($gfx2);

    my $text2	= $self->{page}->text();
    $text2->font($self->{font}->{Verdana},7);
    $text2->fillcolor('#000000');
    $text2->translate($r[3][1],$y-10);
    $text2->text($self->utf2win("Единица измерения"));
    $text2->translate($r[3][10]+5,$y-10);
    $text2->text($self->utf2win("Страна происхождения"));
    undef($text2);

    $text->font($self->{font}->{Verdana},7);
    $self->{_table}->text_block
    (
	$text,
	$self->utf2win("к\nо\nд"),
	x	=> $r[3][1]+3,
	y	=> $y-25,
	h	=> 30,
	w	=> 10,
	lead	=> 9
    );

    $self->{_table}->text_block
    (
	$text,
	$self->utf2win("Условное обозначение (национальное)"),
	x	=> $r[3][2],
	y	=> $y-25,
	h	=> 30,
	w	=> 61,
	lead	=> 7,
	align	=> 'center',
    );

    $self->{_table}->text_block
    (
	$text,
	$self->utf2win("цифро-\nвой код"),
	x	=> $r[3][10]+3,
	y	=> $y-30,
	h	=> 20,
	w	=> 30,
	lead	=> 7,
	align	=> 'center',
    );

    $self->{_table}->text_block
    (
	$text,
	$self->utf2win("краткое\nнаименова-\nние"),
	x	=> $r[3][11]+3,
	y	=> $y-25,
	h	=> 30,
	w	=> 60,
	lead	=> 7,
	align	=> 'center',
    );

#    $text->translate($r[3][10]+4,$y-10);
#    $text->text($self->utf2win('Страна происхождения'));

# Дорисовываем дополнительную строчку "Итого"
    $gfx->move($r[3][0],$r[2]);
    $gfx->vline($r[2]-10);
    $gfx->move($r[3][5],$r[2]);
    $gfx->vline($r[2]-10);
    $gfx->move($r[3][6],$r[2]);
    $gfx->vline($r[2]-10);
    $gfx->move($r[3][8],$r[2]);
    $gfx->vline($r[2]-10);
    $gfx->move($r[3][9],$r[2]);
    $gfx->vline($r[2]-10);
    $gfx->move($r[3][10],$r[2]);
    $gfx->vline($r[2]-10);

    $gfx->move($r[3][0],$r[2]-10);
    $gfx->hline($r[3][10]);

    $gfx->stroke();

# Заполняем "Итого"
    $text->font($self->{font}->{VerdanaB},7);
    $text->translate($r[3][0]+3,$r[2]-8);
    $text->text($self->utf2win('Всего к оплате'));

    $text->font($self->{font}->{Verdana},8);

# Итоговая стоимость без налога (5)
    $text->translate($r[3][5]+3,$r[2]-8);
    $text->text($self->{data}->{sum}->{total});

    $text->translate($r[3][6]+($r[3][8]-$r[3][6])/2-3,$r[2]-8);
    $text->text('X');

# Сумма налога (8)
    $text->translate($r[3][8]+3,$r[2]-8);
    $text->text($self->{invoice}->{nds}?$self->{data}->{sum}->{nds}:'0.00');

# Сумма ИТОГО (9)
    $text->translate($r[3][9]+3,$r[2]-8);
    $text->text($self->amount($self->{data}->{sum}->{total}+$self->{data}->{sum}->{nds}));

# "Подвал"
    $text->translate(20,$r[2]-40);
    $text->text(encode('windows-1251',decode_utf8('Руководитель организации:')));

    $text->distance(300,0);
    $text->text(encode('windows-1251',decode_utf8(sprintf '/                    / %s /', $self->{invoice}->{invoice_boss})),-underline=>'auto');
    $text->distance(200,0);
    $text->text(encode('windows-1251',decode_utf8('Главный бухгалтер:')));
    $text->translate(610,$r[2]-40);
    $text->text($self->utf2win(sprintf '/                    / %s /', $self->{invoice}->{invoice_boss}),-underline=>'auto');

    $text->distance(-280,-10);
    $text->text(encode('windows-1251',decode_utf8('(подпись)')));
    $text->distance(60,0);
    $text->text(encode('windows-1251',decode_utf8('(ф.и.о.)')));

    $text->distance(230,0);
    $text->text(encode('windows-1251',decode_utf8('(подпись)')));
    $text->distance(60,0);
    $text->text(encode('windows-1251',decode_utf8('(ф.и.о.)')));

    if ( $self->{invoice}->{invoice_comment1} )
    {
	$text->translate(20,$r[2]-50);
	$text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_comment1})));
    }

    $text->translate(20,$r[2]-70);
    $text->text(encode('windows-1251',decode_utf8('Индивидуальный предприниматель:')));

    $text->distance(310,-10);
    $text->text(encode('windows-1251',decode_utf8('(подпись)')));
    $text->distance(80,0);
    $text->text(encode('windows-1251',decode_utf8('(ф.и.о.)')));
    $text->distance(210,0);
    $text->text(encode('windows-1251',decode_utf8('(реквизиты свидетель)')));

    $text->translate(20,$r[2]-95);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_comment2})));
    $text->cr(-10);
    $text->text(encode('windows-1251',decode_utf8($self->{invoice}->{invoice_comment3})));

    return $self;
}

sub id
{
    my $self = shift->SUPER::id($_[0]);
    my $total;

    foreach my $row ( @{$self->{data}->{db}} )
    {
	push @{$self->{data}->{content}},
	[
	    $self->utf2win($row->{service_name}),
	    '-',
	    $self->utf2win($row->{unit}),
	    $row->{quantity},
	    $row->{price},
	    $self->amount($row->{price}*$row->{quantity}),
	    $self->utf2win('без акциза'),
	    $self->{invoice}->{nds}?(sprintf '%d%%',$self->nds()->{percent}):'-----',
	    $self->{invoice}->{nds}?$self->nds($row->{price}*$row->{quantity})->{value}:'-----',
	    $self->amount
	    (
		($row->{price}*$row->{quantity})
		+
		($self->{invoice}->{nds}?($self->nds($row->{price}*$row->{quantity})->{value}):0)
	    ),
	    '-----',
	    '-',
	    '-',
	];

	$total += $row->{price} * $row->{quantity};
    }

    $self->{data}->{sum}->{total} = $self->amount($total);
    $self->{data}->{sum}->{nds} = $self->nds($total)->{value};

    return $self;
}

1;
